#include <bits/stdc++.h>
using namespace std;
#define MOEZ ios_base::sync_with_stdio(false);cin.tie(NULL),cout.tie(NULL);
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
#define F first
#define S second
#define pb push_back
#define all(v) v.begin() , v.end()
#define eb emplace_back
#define getunique(v) {sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end());}
#define mem(d , x) memset(d , x , sizeof(d));
#define sz(x) (int)x.size()
const int N = 1e3+5;
//const int M = 1e9+7;
//const ll inf = 1e18;
//const ld eps = 1e-6;
#define int long long
int n , m , b , M , a[501];
int dp[2][501][501];
signed main(){
MOEZ
cin >> n >> m >> b >> M;
for(int i = 0; i < n;i++){
cin >> a[i];
}
dp[0][0][0] = 1;
bool f = true;
for(int i = 0; i < n;i++){
for(int j = 0; j <= m;j++){
for(int k = 0; k <= b;k++){
dp[f][j][k] = dp[(f^1)][j][k];
if(j && k-a[i] >= 0){
dp[f][j][k] += dp[f][j-1][k-a[i]];
}
dp[f][j][k] %= M;
}
}
f ^= 1;
}
int ans = 0;
for(int i = 0; i <= b;i++){
ans += dp[(f^1)][m][i];
ans %= M;
}
cout << ans;
}
1711B - Party | 1702D - Not a Cheap String |
1714F - Build a Tree and That Is It | 1703F - Yet Another Problem About Pairs Satisfying an Inequality |
610A - Pasha and Stick | 1200A - Hotelier |
1091A - New Year and the Christmas Ornament | 1352B - Same Parity Summands |
1102A - Integer Sequence Dividing | 630B - Moore's Law |
1004A - Sonya and Hotels | 1680B - Robots |
1690A - Print a Pedestal (Codeforces logo) | 1295A - Display The Number |
1077A - Frog Jumping | 1714G - Path Prefixes |
1369C - RationalLee | 289B - Polo the Penguin and Matrix |
1716A - 2-3 Moves | 1670B - Dorms War |
1716B - Permutation Chain | 987A - Infinity Gauntlet |
1676G - White-Black Balanced Subtrees | 1716D - Chip Move |
1352F - Binary String Reconstruction | 1487B - Cat Cycle |
1679C - Rooks Defenders | 56A - Bar |
1694B - Paranoid String | 35A - Shell Game |